package com.example.demo3;


import java.time.DayOfWeek;
import java.time.LocalDate;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 案例三：jdk8新时间的应用(方法一)
 */
public class Test1 {
    public static void main(String[] args) {
        // 1.定义首次休息日为2022年2月3日
        LocalDate startDate = LocalDate.of(2022, 2, 3);

        // 2.拿到用户查询的年份和月份
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入查询月份（格式：YYYY-MM）:");
        String currentDate = sc.next() + "-01";
        LocalDate endMonthFirstDate = LocalDate.parse(currentDate);
        LocalDate endDate = endMonthFirstDate;
        // 拿到该月最后一天,作为截至日期 因为月份都是从01开始的,先加上一个月,再减去一天,就可以拿到该月的最后一天
        endDate = endDate.plusMonths(1).minusDays(1);
        System.out.println("该月最后一天是：" + endDate);

        // 3.获取从起始时间开始到截至日期的全部日子,方便标记那些是休息日,方便后面进行信息查询
        List<Day> days = new ArrayList<>();
        // 这个!startDate.isAfter(endDate)意思是 如果起始时间不在截止时间之后,就继续循环,这个条件确保了当起始时间和结束时间相同的时候循环还会执行一次
        // 当起始时间等于截止时间的时候此时startDate.isAfter(endDate)为false,但是取反之后变成了true,然后在循环中起始时间会加一天
        // 当再次判断条件是否成立的时候就会发现 起始时间已经在截止时间之后了,取反之后为false,循环就结束了
        while (!startDate.isAfter(endDate)) {
            Day day = new Day(startDate);
            days.add(day);
            // 让这个日子走向下一天
            startDate = startDate.plusDays(1);
        }
        System.out.println(days);

        // 4.从头开始遍历,标记是否休息
        System.out.println("历史休息情况");
        for (int i = 0; i < days.size(); i += 3) {
            Day day = days.get(i);
            day.setFlag(true); // 标记为休息日
            day.printInfo();
        }
        System.out.println();

        // 5.展示当月的休息情况
        System.out.println("当月休息情况：" + currentDate);
        List<Day> currentDayRest = new ArrayList<>(); // 存放当月休息日的集合
        for (int i = 0; i < days.size(); i++) {
            Day day = days.get(i);
            if (day.getDate().isBefore(endMonthFirstDate)) {
                continue;
            }
            // 展示这一天
            currentDayRest.add(day); // 能走到这里当天肯定是休息日加入休息日集合
            day.printInfo();
        }
        System.out.println();

        // 6.找出当月休息日哪些是周末
        System.out.println("当月周末情况：" + currentDate);
        currentDayRest.stream().filter(d -> (d.getDate().getDayOfWeek() == DayOfWeek.SATURDAY || d.getDate().getDayOfWeek() == DayOfWeek.SUNDAY) && d.isFlag())
                .forEach(d -> System.out.print(d + (d.getDate().getDayOfWeek() == DayOfWeek.SATURDAY ? "周六" : "周日")));
    }
}

